package fr.utbm.tx52.dataManagement;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;

import fr.utbm.tx52.R;
import fr.utbm.tx52.contactsManagement.Contact;
import fr.utbm.tx52.reception.MessageType;
import fr.utbm.tx52.reception.PullService;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.text.GetChars;
import android.util.Log;
import android.util.Pair;
import android.widget.Toast;

/**
 * Classe qui va s'occuper de toute la gestion de l'enregistrement des données sur le téléphone
 */
public final class DataManager {
	
	/**
	 * Le chemin vers les données
	 */
	public static final String DATA_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/tx52/";

	
	
	/**
	 * @see http://www.androidsnippets.com/get-my-phone-number
	 */
	public static String getMyPhoneNumber(Context c){
    	TelephonyManager mTelephonyMgr =(TelephonyManager)c.getSystemService(Context.TELEPHONY_SERVICE); 
    	//return mTelephonyMgr.getLine1Number();
    	return mTelephonyMgr.getLine1Number();
	}
	
	// systemService = getSystemService(Context.TELEPHONY_SERVICE); 
	public static String getMy10DigitPhoneNumber(Context c){
		String s = getMyPhoneNumber(c);
		return s;//s.substring(2);
	}
	
	
	
    /**
     * Création du dossier des données de l'appli s'il n'existe pas
     */
	public static void createApplicationDir() 
	{
		File dir = new File(DataManager.DATA_PATH);
		if ( ! dir.exists() ){
			dir.mkdir();
		}
	}
	
	
	/**
	 * Défini le numéro de téléphone de l'utilisateur de l'application dans les préférences
	 * 
	 * Détail : 
	 * comme le problème est que le numéro de téléphone n'est pas forcément le bon on laisse la possiblité de le modifier
     * mais cela pose un problème au niveau de l'identification
	 */
	public static void fixUserPhoneNumber(Context c)
	{
		SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
        if (prefs.getString("phonenumber", "") == "") {
        	SharedPreferences.Editor prefEditor = prefs.edit();
        	prefEditor.putString("phonenumber", DataManager.getMyPhoneNumber(c));
            prefEditor.commit();
        }
	}
	
	
	/**
	 * Charge la liste des contacts associés à l'application
	 * 
	 * @return La liste des contacts associés à l'application sous la forme <id, téléphone>
	 */
	@SuppressWarnings("unchecked")
	public static Map<Integer, String> loadAssociatedContacts(Context c) {
		
		Map<Integer, String> data = new HashMap<Integer, String>();

		FileInputStream fIn = null; 
        ObjectInputStream isr = null; 
 
        try{ 
            fIn = c.openFileInput("contacts.dat");       
            isr = new ObjectInputStream(fIn); 
            data = (HashMap<Integer, String>) isr.readObject(); 
           
            Log.d(c.getClass().getName(), "loadAssociatedContacts -> ok");
        } 
        catch (Exception e) {
        	Log.d(c.getClass().getName(), "loadAssociatedContacts -> error : " + e.getMessage());
        }
        
		return data;
	}
	
	
	
	/**
	 * Ajout un contact à la liste des contacts associés et sauvegarde cette liste. 
	 * 
	 * Cela envoi également un sms au contact et un message au serveur pour signaler la demande d'amitié
	 * 
	 * Si le contact est déjà dans la liste, un message est affiché
	 * 
	 * @param newContact
	 * 					Le nouveau contact a ajouter à la liste
	 */
	public static void addAssociatedContacts(Activity a, Contact newContact) {

		Context c = a.getApplicationContext();
		
		Map<Integer, String> data = loadAssociatedContacts(c);

		if ( data.keySet().contains(Integer.parseInt(newContact.getID())) ) {
	        AlertDialog.Builder alertbox = new AlertDialog.Builder(a);
	        alertbox.setMessage("Ce contact est déjà dans votre liste de contacts");
	        alertbox.setNeutralButton("Ok", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
	        });
	        alertbox.show();
	        return;
		}
		
		data.put(Integer.parseInt(newContact.getID()), newContact.getPhoneNumber());
		
		// envoi du sms
		sendSms(c, newContact.getName(), newContact.getPhoneNumber());
		
		// envoi de l'info au serveur
		PullService.getInstance().sendMessage(MessageType.ASK_FOR_FRIEND, newContact.getPhoneNumber());
		
        FileOutputStream fOut = null; 
        ObjectOutputStream osw = null; 
 
        try{ 
           fOut = c.openFileOutput("contacts.dat", Context.MODE_PRIVATE);       
            osw = new ObjectOutputStream(fOut); 
            osw.writeObject(data); 
            osw.flush(); 
          
            Log.d("DataManager", "saveAssociatedContacts -> ok");
        } 
        catch (Exception e) {       
        	Log.d("DataManager", "saveAssociatedContacts -> error : " + e.getMessage());
        } 
        finally { 
           try { 
                  osw.close(); 
                  fOut.close(); 
              } catch (IOException e) { 
            	  Log.d("DataManager", "saveAssociatedContacts -> error : " + e.getMessage());
              } 
        }
	}
	
	
	
	/**
	 * Ajout un contact à la liste des contacts associés et sauvegarde cette liste
	 * 
	 * @param id
	 * 				L'identifiant du contact a rejeter de la liste
	 */
	public static void removeAssociatedContacts(Context c, Contact contact) {

		Map<Integer, String> data = loadAssociatedContacts(c);
		data.remove(Integer.parseInt(contact.getID()));
		
		// notification au server
		PullService.getInstance().sendMessage(MessageType.REMOVE_FRIEND, contact.getPhoneNumber());
		
        FileOutputStream fOut = null; 
        ObjectOutputStream osw = null; 
 
        try{ 
           fOut = c.openFileOutput("contacts.dat", Context.MODE_PRIVATE);       
            osw = new ObjectOutputStream(fOut); 
            osw.writeObject(data); 
            osw.flush(); 
          
            Log.d(c.getClass().getName(), "saveAssociatedContacts -> ok");
        } 
        catch (Exception e) {       
        	Log.d(c.getClass().getName(), "saveAssociatedContacts -> error : " + e.getMessage());
        } 
        finally { 
           try { 
                  osw.close(); 
                  fOut.close(); 
              } catch (IOException e) { 
            	  Log.d("DataManager", "saveAssociatedContacts -> error : " + e.getMessage());
              } 
        }
	}
	
	
	
	/**
	 * Envoi d'un sms au nouveau contact pour lui indiquer la procédure d'installation du logiciel
	 * 
	 * Le contenu du sms est défini dans R
	 * 
	 * @param c
	 * 				Le context dans lequel on va afficher un toast d'information
	 * @param contactName
	 * 				Le nom du contact, pour personnaliser un peu le message
	 * @param contactNumber
	 * 				Le numéro de téléphone du contact
	 */
    private static void sendSms(Context c, String contactName, String contactNumber) {
    	/*
    	String message = "Bonjour " + contactName + ",\n" + c.getString(R.string.smscontent);
    	
    	SmsManager.getDefault().sendTextMessage(contactNumber, null, message, null, null);
    	Toast.makeText(c, "Un message a été envoyé à " + contactName + " pour lui indiquer la procédure d'installation", Toast.LENGTH_SHORT).show();
    	//*/
    }
	
}
